package com.zan.backend.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.ListUtils;
import com.zan.backend.common.BaseResponse;
import com.zan.backend.listener.ExcelPageReadListener;
import com.zan.backend.model.entity.ExcelDownloadData;
import com.zan.backend.model.entity.ExcelUploadData;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * @Author Zan
 * @Create 2024/9/10 10:45
 * @ClassName: ExcelController
 * @Description : TODO 请用一句话描述该类的功能
 */
@RestController
@RequestMapping("/excel")
public class ExcelController {

    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link ExcelDownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 读取SQL数据（这里就简单一点，读excel数据）
        List<ExcelDownloadData> list = getExcelDownloadDataList();
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 下载Excel
        // todo 替换 ExcelDownloadData.class 和 list 即可
        EasyExcel.write(response.getOutputStream(), ExcelDownloadData.class).sheet("模板").doWrite(list);
    }

    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link ExcelUploadData}
     * <p>
     * 2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，参照{@link ExcelPageReadListener}
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("upload")
    @ResponseBody
    public BaseResponse<List<ExcelUploadData>> upload(MultipartFile file) throws IOException {
        List<ExcelUploadData> list = ListUtils.newArrayList();
        EasyExcel.read(file.getInputStream(), ExcelUploadData.class, new ExcelPageReadListener<ExcelUploadData>(list::addAll)).sheet().doRead();
        System.out.println(list);
        // todo excel里的数据读取出来后，对list做处理即可，例如：插入数据库
        return BaseResponse.success(list);
    }

    /**
     * 获取Excel的数据
     * @return
     */
    private List<ExcelDownloadData> getExcelDownloadDataList() {
        List<ExcelDownloadData> list = ListUtils.newArrayList();
        String fileName = this.getClass().getResource("/").getPath() + "static/excel" + File.separator + "demo.xlsx";
        // 获取数据
        EasyExcel.read(fileName, ExcelDownloadData.class, new ExcelPageReadListener<ExcelDownloadData>(list::addAll)).sheet().doRead();
        return list;
    }
}
